/*-------------------------------------------------------------------------
 *
 * pg_cast.h
 *	  "类型转换"系统目录 (pg_cast) 的定义
 *
 * 从 Postgres 8.0 开始，pg_cast 不仅描述类型强制函数，还描述长度强制函数。
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/catalog/pg_cast.h
 *
 * NOTES
 *	  Catalog.pm 模块读取此文件并推导模式信息。
 *
 *-------------------------------------------------------------------------
 */
#ifndef PG_CAST_H
#define PG_CAST_H

#include "catalog/dependency.h"
#include "catalog/genbki.h"
#include "catalog/pg_cast_d.h"

/* ----------------
 *		pg_cast 定义。cpp 将其转换为
 *		typedef struct FormData_pg_cast
 * ----------------
 */
CATALOG(pg_cast,2605,CastRelationId)
{
	Oid			oid;			/* oid */

	/* 转换的源数据类型 */
	Oid			castsource BKI_LOOKUP(pg_type);

	/* 转换的目标数据类型 */
	Oid			casttarget BKI_LOOKUP(pg_type);

	/* 转换函数；0 = 二进制强制转换 */
	Oid			castfunc BKI_LOOKUP_OPT(pg_proc);

	/* 可以使用转换的上下文 */
	char		castcontext;

	/* 转换方法 */
	char		castmethod;
} FormData_pg_cast;

/* ----------------
 *		Form_pg_cast 对应指向具有 pg_cast 关系格式的元组的指针。
 * ----------------
 */
typedef FormData_pg_cast *Form_pg_cast;

DECLARE_UNIQUE_INDEX_PKEY(pg_cast_oid_index, 2660, CastOidIndexId, on pg_cast using btree(oid oid_ops));
DECLARE_UNIQUE_INDEX(pg_cast_source_target_index, 2661, CastSourceTargetIndexId, on pg_cast using btree(castsource oid_ops, casttarget oid_ops));

#ifdef EXPOSE_TO_CLIENT_CODE

/*
 * pg_cast.castcontext的允许值由此枚举指定。
 * 由于castcontext存储为“char”，我们使用ASCII码以便于人类
 * 阅读表格。 注意，在后端内部，
 * 这些值被转换为CoercionContext枚举（见primnodes.h），
 * 该枚举定义为便于排序；ASCII码不需要
 * 按照任何特殊顺序进行排序。
 */

typedef enum CoercionCodes
{
	COERCION_CODE_IMPLICIT = 'i',	/* 表达式上下文中的强制转换 */
	COERCION_CODE_ASSIGNMENT = 'a', /* 赋值上下文中的强制转换 */
	COERCION_CODE_EXPLICIT = 'e'	/* 显式强制转换操作 */
} CoercionCodes;

/*
 * pg_cast.castmethod的允许值由此枚举指定。
 * 由于castmethod存储为“char”，我们使用ASCII码以便于人类
 * 阅读表格。
 */
typedef enum CoercionMethod
{
	COERCION_METHOD_FUNCTION = 'f', /* 使用一个函数 */
	COERCION_METHOD_BINARY = 'b',	/* 类型是二进制兼容的 */
	COERCION_METHOD_INOUT = 'i' /* 使用输入/输出函数 */
} CoercionMethod;

#endif							/* EXPOSE_TO_CLIENT_CODE */


extern ObjectAddress CastCreate(Oid sourcetypeid,
								Oid targettypeid,
								Oid funcid,
								char castcontext,
								char castmethod,
								DependencyType behavior);

#endif							/* PG_CAST_H */
